iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

用Line聊天機器人串起多媒體系統系列 第 15

Day 15 : 入厝 Heroku 建構 LINE Chat Bot - 1 ( Heroku 架設篇 )

  • 分享至 

  • xImage
  •  

!2022.8.29責任更新: 因 heroku 已公告自2022.11月收費,可遷移至其他雲端服務, fly.io 實測可以達成,您可以將本系列文的程式轉移部署至 fly.io,教學請參閱我的HackMD/images/emoticon/emoticon41.gif

為了在本機建立逐步建立您的 LINE Chat Bot , 並且透過 ngrok 讓您的 Flask 得以運作,本系列文在 Day 12Day13Day 14 分3篇介紹,但透過 ngrok 要時常修改 Webhook 做測試時尚可,對於追求穩定的佈署環境並非適當,如果可以將程式放在雲端執行多好,接下來我們要佈署的伺服器為免費就夠用的 Heroku ,不只五星級而且有省錢。 Heroku 是個雲端伺服器,因為他的專案( Heroku 稱為 dyno) 可以產生具安全驗證的 https 網域, Python 等程式皆可運行,缺點是 30 分鐘不動他會休眠,每月至多醒 550 小時(有綁定信用卡可免費至多 1000 小時, dyno 合併計算),每次休眠喚醒需要約 30 秒時間,對 LINE 聊天機器人使用者而言稍嫌體驗不佳,後續會說明如何長期喚醒。當然如果你要換 AWS 或 GCP 也很不錯。

佈署 echo 機器人至 Heroku 雲端伺服器

1. 建立 Git 版本控制環境

  • 如何建立已經提前寫在 Day 4 : Git、Github 與他們快樂好夥伴們,重述安裝過程有改動的設定:
    • 預設編輯器改為 VS CODE。
    • Git Bash 改為用 windows console。
    • 在終端機輸入git --version確認版本,如有顯示表示安裝完成。
    • 輸入 git config --global user.name "你的名字"git config --global user.email "和你的信箱" 初始化你的 Git 環境。

      - 先告一段落。

2. 建立Heroku伺服器環境

  • 到 Heroku服務官方網址 https://www.heroku.com/ 註冊帳號。
  • 依您的作業系統安裝Heroku CLI,我們持續以 Windows 進行解說。
    • 有提示電腦要先安裝好 Git 唷,下載安裝檔後就是一直 Next 啦。
    • 最後在終端機確認版本即可確認是否安裝成功。
      $ heroku -v
      

3. 在 Heroku 佈署聊天機器人

走到這一步你的聊天機器人可以真正走上雲端了!

  1. 在 Heroku 點選建立新的 app 。

  2. 賞個名子讓他獲得加護(大賢者:【告】,沒有這回事)。

  3. 檢視 Deply 各種指令,指令幾乎針對你的 dyno 所寫,只要依照需求執行即可,跟妹妹一樣貼心。

  4. 在 Heroku 的 setting 裡,在 "Add Buildpack" 選項中選擇 Python。

  5. 回到電腦本機,創一個準備跟heroku同步的資料夾。

  6. 在 CMD 輸入 heroku login ,依指引完成登入。

  7. 至本機資料夾完成 Git 版本控制初始化動作。本機資料夾在 Windows作業系統的話以cd 資料夾位址切換,在資料夾內輸入git init完成初始化。

  8. 增加3個必需的檔案, Procfilerutime.txtrequirements.txt:

    1. 在資料夾增加 Procfile 檔案(無須副檔名),告訴 Heroku 我們的應用程式是 web 類型的應用程式,以及需要執行的是 app 這個檔案,Procfile 的內容只需要一行 web: gunicorn app:app –preload(!先前範例為web: gunicorn app_core:app –preload,這會導致錯誤的結果,請配合更新)。

      web: gunicorn app:app –preload
      

    2. 增加 rutime.txt 檔案,好讓 Heroku 知道你要用什麼程式執行。Python版本請見buildpack說明(3.8.2已不支援!)

      python-3.8.12
      

    3. 增加 requirements.txt 檔案,好讓heroku這純白的伺服器也知道要外部加載什麼模組。版本號碼不知道可以在終端機以 pip list 指令查詢。

      Flask==1.1.2
      line-bot-sdk==1.16.0
      gunicorn==20.0.4
      

    • 你的資料夾目前應該有4個檔案。
  9. 最後,在資料夾下執行以下3個指令:

    $ git add .
    $ git commit -am "make it better"
    $ git push heroku master
    
    • git add .表示在此資料夾所有的異動,準備加入git版控。
    • git commit -am "make it better"表示留下對此版本的註解,方便日後溝通查閱。
    • git push heroku master表示要push變更內容到heroku伺服器的master主幹。如果出現remote: Verifying deploy... done.就是成功啦,有紅字代表錯誤再試著排除喔。
  10. 至 Heroku 檢查是否成功。

    • 至 Overview 或 Activity 可以看到更新動態。
    • 在 Settings 裡的 Domains 有你剛建立 dyno 的專屬 URL,會是 https://{你的dyno名稱}.herokuapp.com/

4. 回頭修改 webhook URL

  1. 將你的 dyno 專屬 URL 貼到你 LINE bot channel 的 Webhook 欄位,記得修改為 https://{你的dyno名稱}.herokuapp.com/callback
    https://{你的dyno名稱}.herokuapp.com/callback
    
  2. 按下 Verify 要等 Heroku 回傳訊息,因 Heroku 會睡覺要大概 30 秒喚醒,加上第一次建立連線,再多嘗試幾次。
    • 嘗試學著看 Heroku 的 logs ,任何錯誤碼都會顯示並試著排除,舉例如遇到 H14碼,至 Heroku 錯誤代碼查詢意義為何。

小結

本篇開始將本機的程式佈署至雲端,讓您的聊天機器人如同線上的多媒體系統,可以在雲端無時無刻的提供服務。因 Heroku 免費且提供的服務網址具有 Https 憑證,不需要額外申請即可使用,讓串接需要 Https 的 LINE Message API 可以順利接獲訊息。之後我們會再完成讓 Heroku 更完整的設定,我們下篇見。

!2022.8.29責任更新: 因 heroku 已公告自2022.11月收費,可遷移至其他雲端服務, fly.io 實測可以達成,您可以將本系列文的程式轉移部署至 fly.io,教學請參閱我的HackMD/images/emoticon/emoticon41.gif


上一篇
Day 14 : 以本機招喚 3 星鸚鵡 LINE Chat Bot - 3 (用 ngrok 連接你的 LINE Channel )
下一篇
Day 16 : 入厝 Heroku 建構 LINE Chat Bot - 2 (管好你的 Token )
系列文
用Line聊天機器人串起多媒體系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
腎單粒
iT邦新手 5 級 ‧ 2021-09-23 15:58:19

想問一下照著筆者的步驟做,為何會出現下面的ERRORhttps://ithelp.ithome.com.tw/upload/images/20210923/20140755CkZeOVN6Mt.jpg

看更多先前的回應...收起先前的回應...
威利斯 iT邦研究生 1 級 ‧ 2021-09-23 23:42:43 檢舉

剛測試還可以執行,推測您遇到的狀況:

  • 在 LINE Developer 的 webhook 輸入對應網址應該是https://linefresh2021.herokuapp.com/callback
    ,記得在網址要加入callback。
  • webhook Verify 大約要等30秒,這是因為 Heroku 服務有冷啟動的問題,喚醒 Heroku 需要些時間。

推測原因主要是錯誤碼 503 是屬於伺服器端的問題,5XX 系列都是伺服器的狀況,如果無連線是 404 ,他能跟您反饋 503 表示伺服器有收到但有問題,很有可能是網址加上 callback 才會觸發回傳動作有關,您再試試看喔。

威利斯 iT邦研究生 1 級 ‧ 2021-12-03 00:19:30 檢舉

今日測試發現是因為runtime.txt原為3.8.2,Heroku已不支援,查閱支援版本後您可更改為3.8.12,Python版本請見buildpack說明。
但具體而言您應該要查閱Heroku的logs確認問題所在,終端機也可以輸入heroku logs --tail看異常狀況,上述只是我自己測試時發現的問題,供您參考。

Mactone iT邦新手 5 級 ‧ 2022-01-02 13:30:01 檢舉

我遇到跟一樓問的一樣,把runtime修改也一樣,verify同樣出現error,檢查heroku的log,看起來是App crashed! 但不清楚究竟為何?

2022-01-02T05:25:30.337244+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/callback" host=arbitage-profit-bot.herokuapp.com request_id=b27a52cf-eec3-4b53-9b1d-205e7a3e277e fwd="147.92.150.194" dyno= connect= service= status=503 bytes= protocol=https
2022-01-02T05:28:12.699233+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/callback" host=arbitage-profit-bot.herokuapp.com request_id=69673c97-e9b9-4a39-bf23-6e84199576f1 fwd="147.92.150.193" dyno= connect= service= status=503 bytes= protocol=https

威利斯 iT邦研究生 1 級 ‧ 2022-01-02 23:01:39 檢舉

您好,經測試應該跟Procfile有關,請更正如下:

web: gunicorn app:app –preload

(!先前範例為web: gunicorn app_core:app –preload,這會導致錯誤的結果,請再試試看,謝謝您)

我要留言

立即登入留言